####### checks for kdecore/kauth ###############

set(KAUTH_BACKEND_NAME "" CACHE STRING "Specifies the KAuth backend to build. Current available options are
                                   PolkitQt6-1, Fake, OSX. Not setting this variable will build the most
                                   appropriate backend for your system")

# Case-insensitive
string(TOUPPER "${KAUTH_BACKEND_NAME}" KAUTH_BACKEND_NAME)

set(KAUTH_BACKEND ${KAUTH_BACKEND_NAME})

set(POLKITQT_MIN_VERSION 0.112.0 PARENT_SCOPE)

## Check if the user did not specify a backend to be built. If that is the case,
## we check what is the best backend to build on this system.
if(NOT KAUTH_BACKEND)
    # Look for the most appropriate backend
    message(STATUS "No backend for KAuth was explicitly specified: probing system to find the best one available")
    if(APPLE)
        set(KAUTH_BACKEND "OSX")
    elseif(UNIX)
        find_package(PolkitQt6-1 ${POLKITQT_MIN_VERSION})

        if(PolkitQt6-1_FOUND)
            set(KAUTH_BACKEND "POLKITQT6-1")

            set_package_properties(PolkitQt6-1 PROPERTIES
              URL "http://techbase.kde.org/Polkit-Qt-1"
              DESCRIPTION "PolicyKit API for Qt"
              TYPE RECOMMENDED
              PURPOSE "Support for executing privileged actions in a controlled way (KAuth)"
            )

            find_package(KF6WindowSystem ${KF_DEP_VERSION} REQUIRED)
        else()
            set(KAUTH_BACKEND "FAKE")
        endif()
    else()
        set(KAUTH_BACKEND "FAKE")
    endif()

elseif(KAUTH_BACKEND AND NOT KAUTH_BUILD_CODEGENERATOR_ONLY)
    # Check if the specified backend is valid. If it is not, we fall back to the FAKE one
    if(NOT KAUTH_BACKEND STREQUAL "OSX"
        AND NOT KAUTH_BACKEND STREQUAL "POLKITQT6-1"
        AND NOT KAUTH_BACKEND STREQUAL "FAKE")
        message("WARNING: The KAuth Backend ${KAUTH_BACKEND} you specified does not exist. Falling back to Fake backend")
        set(KAUTH_BACKEND "FAKE")
    endif()

    # Check requirements for each backend. If not, fall back to the fake one
    if(KAUTH_BACKEND STREQUAL "OSX" AND NOT APPLE)
        message("WARNING: You chose the OSX KAuth backend but your system does not support it. Falling back to Fake backend")
        set(KAUTH_BACKEND "FAKE")
    endif()

    if(KAUTH_BACKEND STREQUAL "POLKITQT6-1")
        find_package(PolkitQt6-1 ${POLKITQT_MIN_VERSION})
        set_package_properties(PolkitQt6-1 PROPERTIES
          URL "http://techbase.kde.org/Polkit-Qt-1"
          DESCRIPTION "PolicyKit API for Qt"
          TYPE RECOMMENDED
          PURPOSE "Support for executing privileged actions in a controlled way (KAuth). This is required to make KAuth work, and hence enable certain workspace functionalities"
        )

        if(NOT PolkitQt6-1_FOUND)
            message("WARNING: You chose the PolkitQt6-1 KAuth backend but you don't have PolkitQt6-1 installed.
                      Falling back to Fake backend")
            set(KAUTH_BACKEND "FAKE")
        else()
            find_package(KF6WindowSystem ${KF_DEP_VERSION} REQUIRED)
            find_package(Qt6DBus ${REQUIRED_QT_VERSION} CONFIG REQUIRED)
        endif()
    endif()
endif()

set(KAUTH_BACKEND_NAME ${KAUTH_BACKEND} CACHE STRING "Specifies the KAuth backend to build. Current available options are
                                   PolkitQt6-1, Fake, OSX. Not setting this variable will build the most
                                   appropriate backend for your system" FORCE)

# Add the correct libraries depending on the backend, and eventually set the policy files install location
if(KAUTH_BACKEND_NAME STREQUAL "OSX")
    find_library(CORE_FOUNDATION_LIBRARY CoreFoundation)
    find_library(SECURITY_LIBRARY Security)

    message(STATUS "Building OSX KAuth backend")

    set(KAUTH_BACKEND_SRCS
        backends/mac/AuthServicesBackend.cpp
    )

    set(KAUTH_BACKEND_LIBS ${SECURITY_LIBRARY} Qt6::Core KF6::AuthCore)
elseif(KAUTH_BACKEND_NAME STREQUAL "POLKITQT6-1")
    message(STATUS "Building PolkitQt6-1 KAuth backend")

    include_directories(SYSTEM ${POLKITQT-1_INCLUDE_DIR})

    set(KAUTH_BACKEND_SRCS
        backends/polkit-1/Polkit1Backend.cpp
    )

    set(KAUTH_BACKEND_LIBS ${POLKITQT-1_CORE_LIBRARY} Qt6::DBus Qt6::Gui KF6::AuthCore KF6::WindowSystem)

    # POLKITQT-1_POLICY_FILES_INSTALL_DIR has an absolute pathname, fix that.
    if(PolkitQt6-1_FOUND)
        string(REPLACE ${POLKITQT-1_INSTALL_DIR}
            ${CMAKE_INSTALL_PREFIX} _KAUTH_POLICY_FILES_INSTALL_DIR
            ${POLKITQT-1_POLICY_FILES_INSTALL_DIR})
    endif()

    set(KAUTH_POLICY_FILES_INSTALL_DIR ${_KAUTH_POLICY_FILES_INSTALL_DIR} CACHE STRING
        "Where policy files generated by KAuth will be installed" FORCE)
elseif(KAUTH_BACKEND_NAME STREQUAL "FAKE")
    set(KAUTH_COMPILING_FAKE_BACKEND TRUE)

    message(STATUS "Building Fake KAuth backend")
    message("WARNING: No valid KAuth backends will be built. The library will not work properly unless compiled with
             a working backend")
endif()

# KAuth policy generator executable source probing
set(KAUTH_POLICY_GEN_SRCS
    policy-gen/policy-gen.cpp)
set(KAUTH_POLICY_GEN_LIBRARIES)

if(KAUTH_BACKEND_NAME STREQUAL "OSX")
   set(KAUTH_POLICY_GEN_SRCS ${KAUTH_POLICY_GEN_SRCS}
       backends/mac/kauth-policy-gen-mac.cpp)
   set(KAUTH_POLICY_GEN_LIBRARIES ${KAUTH_POLICY_GEN_LIBRARIES} ${CORE_FOUNDATION_LIBRARY} ${SECURITY_LIBRARY} Qt6::Core)
elseif(KAUTH_BACKEND_NAME STREQUAL "POLKITQT6-1")
  set(KAUTH_POLICY_GEN_SRCS ${KAUTH_POLICY_GEN_SRCS}
      backends/polkit-1/kauth-policy-gen-polkit1.cpp)
  set(KAUTH_POLICY_GEN_LIBRARIES ${KAUTH_POLICY_GEN_LIBRARIES}
      Qt6::Core)
endif()

########################
# Helper backend probing

set(KAUTH_HELPER_BACKEND_NAME "" CACHE STRING "Specifies the KAuth helper backend to build. Current available options are
                                   DBus, Fake. Not setting this variable will build the most appropriate backend for your system")

set(KAUTH_HELPER_BACKEND ${KAUTH_HELPER_BACKEND_NAME})

if(NOT KAUTH_HELPER_BACKEND)
    # No checks needed, just set the dbus backend
    set(KAUTH_HELPER_BACKEND "DBus")
    string(TOUPPER ${KAUTH_HELPER_BACKEND} KAUTH_HELPER_BACKEND_UPPER)
    set(KAUTH_HELPER_BACKEND ${KAUTH_HELPER_BACKEND_UPPER})
else()
    # No checks needed here either
    string(TOUPPER ${KAUTH_HELPER_BACKEND} KAUTH_HELPER_BACKEND_UPPER)
    set(KAUTH_HELPER_BACKEND ${KAUTH_HELPER_BACKEND_UPPER})
endif()

set(KAUTH_HELPER_BACKEND_NAME ${KAUTH_HELPER_BACKEND} CACHE STRING "Specifies the KAuth helper backend to build. Current
                                                            available options are DBus, Fake. Not setting this variable will
                                                            build the most appropriate backend for your system" FORCE)

# Add the correct libraries/files depending on the backend
if(KAUTH_HELPER_BACKEND_NAME STREQUAL "DBUS")
    qt_add_dbus_adaptor(kauth_dbus_adaptor_SRCS
                        backends/dbus/org.kde.kf6auth.xml
                        backends/dbus/DBusHelperProxy.h
                        KAuth::DBusHelperProxy)

    set(KAUTH_HELPER_BACKEND_SRCS
        backends/dbus/DBusHelperProxy.cpp
        ${kauth_dbus_adaptor_SRCS}
    )

    set(KAUTH_HELPER_BACKEND_LIBS Qt6::DBus KF6::AuthCore)

    # Install some files as well
    install(FILES backends/dbus/org.kde.kf6auth.conf
             DESTINATION ${KDE_INSTALL_DBUSDIR}/system.d)

    install(FILES backends/dbus/dbus_policy.stub
                   backends/dbus/dbus_service.stub
             DESTINATION ${KDE_INSTALL_DATADIR_KF}/kauth COMPONENT Devel)
elseif(KAUTH_HELPER_BACKEND_NAME STREQUAL "FAKE")
    message("WARNING: No valid KAuth helper backends will be built. The library will not work properly unless compiled with
             a working backend")
endif()

# Set directories for plugins
if(NOT WIN32)

  # ###
  # WARNING Copied from KDE4Internal. Decide whether this should be fixed in
  # CMake or in ECM:
  # ###

  # This macro implements some very special logic how to deal with the cache.
  # By default the various install locations inherit their value from their "parent" variable
  # so if you set CMAKE_INSTALL_PREFIX, then EXEC_INSTALL_PREFIX, PLUGIN_INSTALL_DIR will
  # calculate their value by appending subdirs to CMAKE_INSTALL_PREFIX .
  # This would work completely without using the cache.
  # But if somebody wants e.g. a different EXEC_INSTALL_PREFIX this value has to go into
  # the cache, otherwise it will be forgotten on the next cmake run.
  # Once a variable is in the cache, it doesn't depend on its "parent" variables
  # anymore and you can only change it by editing it directly.
  # this macro helps in this regard, because as long as you don't set one of the
  # variables explicitly to some location, it will always calculate its value from its
  # parents. So modifying CMAKE_INSTALL_PREFIX later on will have the desired effect.
  # But once you decide to set e.g. EXEC_INSTALL_PREFIX to some special location
  # this will go into the cache and it will no longer depend on CMAKE_INSTALL_PREFIX.
  #
  # additionally if installing to the same location as kdelibs, the other install
  # directories are reused from the installed kdelibs
  macro(_SET_FANCY _var _value _comment)
    set(predefinedvalue "${_value}")
    if(NOT DEFINED ${_var})
        set(${_var} ${predefinedvalue})
    else()
        set(${_var} "${${_var}}" CACHE PATH "${_comment}")
    endif()
  endmacro()
  _set_fancy(KAUTH_HELPER_PLUGIN_DIR "kf6/kauth/helper" "Where KAuth's helper plugin will be installed")
  _set_fancy(KAUTH_BACKEND_PLUGIN_DIR "kf6/kauth/backend" "Where KAuth's backend plugin will be installed")
  #set(KAUTH_OTHER_PLUGIN_DIR "${QT_PLUGINS_DIR}/kauth/plugins")
else()
    set(KAUTH_HELPER_PLUGIN_DIR "kf6/kauth/helper")
    set(KAUTH_BACKEND_PLUGIN_DIR "kf6/kauth/backend")
endif()

## End
